前言
使用Easy Location在评论区插入用户位置时,若用户使用IPv6地址,则无法获取其位置信息。
检查插件源码发现,作者使用的是IPIP.net提供的测试版IPv4数据库,因此不支持IPv6解析。经过不断寻找,最终找到了一位开发者整理的纯真地理位置数据库,该数据库同时支持IPv4和IPv6,并且兼容IPIP的数据格式,可以直接替换使用!
先看一下效果:
那么就让我们开始操作吧。
下载数据库
下面是大佬开源整理好数据库GitHub地址:
可以进GitHub下载,或者直接点击下载。
大佬提供了两个版本的数据库,经过测试这里我们选择标准版效果比较好。
下载完之后将数据库放到插件根目录(/wp-content/plugins/easy-location)。
可以把数据库名字改成与原数据库名相同(ipipfree.ipdb),现在就可以支持IPV6了,但是在使用的时候很大概率IPV6地址的位置还是不会显示。嫌麻烦到这就可以结束了,要想更好的效果可以接着跟着操作。
修改代码
查询IP位置时数据库返回的值为:
["国家名称","地区名称","城市名称","地区名称","所有者域名","isp_域","国家代码","大陆代码"]
插件原作则直接取得是“地区名称”,但是在IPV6时”地区名称“可能为空,这时候就要返回“国家名称”来显示大概的用户位置。
在插件根目录打开easy-location.php文件,找到get_user_city( )函数:
将整个if判断替换为下方代码:
if (!function_exists('get_user_city')) :
function get_user_city($ip)
{
$locationInfo = false;
try {
$reader = new Reader(__DIR__ . '/qqwry.ipdb');
$locationArray = $reader->find($ip, 'CN');
if (is_array($locationArray)) {
$city = isset($locationArray[1]) ? trim($locationArray[1]) : '';
$country = isset($locationArray[0]) ? trim($locationArray[0]) : '';
if (!empty($city)) {
$locationInfo = $city;
}
elseif (!empty($country)) {
$locationInfo = $country;
}
else {
$locationInfo = "暂无";
}
}
} catch (\Throwable $th) {
return false;
}
return $locationInfo;
}
endif;
保存文件重启网站就可以看到效果啦。
最后
代码可能还有情况没有考虑到,如果发现bug可以在评论中提出,如果有更好的实现方法也可以提出一起交流。
Easy Location原帖:WordPress 插件 Easy Location – Fatesinger
qqwry.ipdb数据库Github地址:metowolf/qqwry.ipdb: 🐈️ 纯真数据库 IPIP.net 格式版,Make qqwry.ipdb Great Again!!!
感谢分享